package controller

import (
	"fmt"
	"github.com/afex/hystrix-go/hystrix"
	"github.com/gin-contrib/sessions"
	"github.com/gin-gonic/gin"
	"myweb/web/proto/house"
	"myweb/web/utils"
	"path"
)

type HouseStu struct {
	Acreage   string   `json:"acreage"`
	Address   string   `json:"address"`
	AreaId    string   `json:"area_id"`
	Beds      string   `json:"beds"`
	Capacity  string   `json:"capacity"`
	Deposit   string   `json:"deposit"`
	Facility  []string `json:"facility"`
	MaxDays   string   `json:"max_days"`
	MinDays   string   `json:"min_days"`
	Price     string   `json:"price"`
	RoomCount string   `json:"room_count"`
	Title     string   `json:"title"`
	Unit      string   `json:"unit"`
}

// PostHouses 发布房屋信息
// @Summary 发布房屋信息
// @Description 发布房屋信息
// @Tags 发布房屋信息
// @Accept json
// @Produce json
// @Param userName body string true "用户名"
// @Param HouseStu body HouseStu true "房屋信息"
// @Success 200 {string} HouseData* "信息"
// @Router /api/v1.0/houses [POST]
func PostHouses(ctx *gin.Context) {
	// 获取当前登录用户
	session := sessions.Default(ctx)
	userName := session.Get("userName")
	fmt.Println("userName", userName.(string))

	var houseStu HouseStu
	ctx.ShouldBind(&houseStu)
	fmt.Println("houseStu", houseStu)

	houseService := ctx.Keys["House"].(house.HouseClient)
	var res = new(house.Response)

	var err error
	err = hystrix.Do("house", func() error {
		var err error
		res, err = houseService.PubHouse(ctx, &house.Request{
			Acreage:   houseStu.Acreage,
			Address:   houseStu.Address,
			AreaId:    houseStu.AreaId,
			Beds:      houseStu.Beds,
			Capacity:  houseStu.Capacity,
			Deposit:   houseStu.Deposit,
			Facility:  houseStu.Facility,
			MaxDays:   houseStu.MaxDays,
			MinDays:   houseStu.MinDays,
			Price:     houseStu.Price,
			RoomCount: houseStu.RoomCount,
			Title:     houseStu.Title,
			Unit:      houseStu.Unit,
			UserName:  userName.(string),
		})
		return err
	}, nil)

	if err != nil {
		fmt.Println("微服务调用错误:", err)
		ResponseError(ctx, utils.RECODE_SERVERERR)
		return
	}
	if res.Errno == utils.RECODE_DBERR {
		fmt.Println("上传房屋信息到数据库错误:", err)
		ResponseError(ctx, utils.RECODE_DBERR)
		return
	}
	fmt.Println("houses:", res.Data)
	// 查询当前用户的所有房屋信息。
	ResponseOK(ctx, utils.RECODE_OK, res.Data)

}

// PostHousesImage 上传房屋图片 待实现
// @Summary 上传房屋图片
// @Description 上传房屋图片
// @Tags 上传房屋图片
// @Accept json
// @Produce json
// @Param id path string true "图片号"
// @Success 200 {string} HouseData* "信息"
// @Router /api/v1.0/houses/:id/images [POST]
// 表单数据： multipart/form-data; boundary
func PostHousesImage(ctx *gin.Context) {
	//获取数据
	houseId := ctx.Param("id")
	fmt.Println("houseID: ", houseId)

	file, err := ctx.FormFile("house_image")

	// 校验数据
	if houseId == "" || err != nil {
		fmt.Println("获取图片二进制数据出错err: ", err)
		return
	}

	if file.Size > 50000000 {
		fmt.Println("文件过大")
		return
	}
	// go语言根据文件名获取文件后缀, 带有"."
	fileExt := path.Ext(file.Filename)
	if fileExt != ".jpg" && fileExt != ".png" {
		fmt.Println("图片格式不正确")
		return
	}

	// 打开文件，读取文件内容
	f, _ := file.Open()
	buf := make([]byte, file.Size)
	// 读取文件内容，保存至缓冲区
	f.Read(buf)

	houseService := ctx.Keys["House"].(house.HouseClient)
	var resp = new(house.ImgResp)
	err = hystrix.Do("house", func() error {
		var err error
		resp, err = houseService.PostHousesImage(ctx, &house.ImgReq{
			HouseId: houseId,
			ImgData: buf,
			FileExt: fileExt,
		})
		return err
	}, nil)

	if err != nil {
		fmt.Println("微服务调用错误:", err)
		ResponseError(ctx, utils.RECODE_SERVERERR)
		return
	}

	//ctx.JSON(http.StatusOK, resp)
	ResponseOK(ctx, utils.RECODE_OK, resp)
}

// GetHouseInfo 展示房屋详情
// @Summary 展示房屋详情
// @Description 展示房屋详情
// @Tags 展示房屋详情
// @Accept json
// @Produce json
// @Param id path string true "房屋号"
// @Success 200 {string} DetailData* "房屋详情"
// @Router /api/v1.0/houses/:id [GET]
func GetHouseInfo(ctx *gin.Context) {
	//获取数据
	houseId := ctx.Param("id")
	//校验数据
	if houseId == "" {
		fmt.Println("获取数据错误")
		return
	}
	userName := sessions.Default(ctx).Get("userName")

	houseService := ctx.Keys["House"].(house.HouseClient)
	var resp = new(house.DetailResp)
	err := hystrix.Do("house", func() error {
		var err error
		resp, err = houseService.GetHouseDetail(ctx, &house.DetailReq{
			HouseId:  houseId,
			UserName: userName.(string),
		})
		return err
	}, nil)

	if err != nil {
		fmt.Println("微服务调用错误:", err)
		ResponseError(ctx, utils.RECODE_SERVERERR)
		return
	}
	if resp.Errno == utils.RECODE_DBERR {
		fmt.Println("查询房屋详情错误:", err)
		ResponseError(ctx, utils.RECODE_DBERR)
		return
	}
	fmt.Println("houses info:", resp.Data)
	ResponseOK(ctx, utils.RECODE_OK, resp.Data)
}

//////////
//{
//    "errno": "0",
//    "errmsg": "成功",
//    "data": {
//        "houses": [
//            {
//                "address": "北京大学西门",
//                "area_name": "海淀区",
//                "ctime": "2023-09-19 23:14:02",
//                "house_id": 1,
//                "img_url": "http://10.10.53.170:80/group1/M00/00/00/Cgo1qmT9weqAeGhzABgnwz6phbM927.jpg",
//                "price": 15000,
//                "room_count": 1,
//                "title": "豪华套房",
//                "user_avatar": "http://10.10.53.170:80/group1/M00/00/00/Cgo1qmUIG_WAKJiXAFEtSs1PAl4877.jpg"
//            },
//            {
//                "address": "信创园12号",
//                "area_name": "西城区",
//                "ctime": "2023-09-20 10:37:15",
//                "house_id": 2,
//                "img_url": "http://10.10.53.170:80/group1/M00/00/00/Cgo1qmT9yBqAQj-ZABLbbYUXTbw312.jpg",
//                "price": 999,
//                "room_count": 1,
//                "title": "137总统房",
//                "user_avatar": "http://10.10.53.170:80/group1/M00/00/00/Cgo1qmUIHDmADIY-ACbefD6Z2qk674.jpg"
//            }
//        ]
//    }
//}

// ///////////////////////
// GetIndex 获取首页轮播图片服务
// @Summary 获取首页轮播图片服务
// @Description 获取首页轮播图片服务
// @Tags 获取首页轮播图片服务
// @Accept json
// @Produce json
// @Success 200 {string} GetData* "首页轮播图"
// @Router /api/v1.0/house/index [GET]
func GetIndex(ctx *gin.Context) {
	houseService := ctx.Keys["House"].(house.HouseClient)
	var resp = new(house.GetResp)

	var err error
	err = hystrix.Do("house", func() error {
		var err error
		resp, err = houseService.GetIndexHouse(ctx, &house.IndexReq{})
		return err
	}, nil)

	if err != nil {
		fmt.Println("微服务调用错误:", err)
		ResponseError(ctx, utils.RECODE_SERVERERR)
		return
	}
	if resp.Errno == utils.RECODE_DBERR {
		fmt.Println("查询房屋详情错误:", err)
		ResponseError(ctx, utils.RECODE_DBERR)
		return
	}
	fmt.Println("houses index:", resp)
	ResponseOK(ctx, utils.RECODE_OK, resp.Data)
}

// GetHouses 搜索房屋
// @Summary 搜索房屋
// @Description 搜索房屋
// @Tags 搜索房
// @Accept json
// @Produce json
// @Param aid query string true "areaId"
// @Param sd query string true "start day"
// @Param ed query string true "end day"
// @Param sk query string true "排序方式"
// @Success 200 {string} GetData* "房屋信息列表"
// @Router /api/v1.0/houses [GET]
func GetHouses(ctx *gin.Context) {
	//获取数据
	//areaId
	aid := ctx.Query("aid")
	//start day
	sd := ctx.Query("sd")
	//end day
	ed := ctx.Query("ed")
	//排序方式
	sk := ctx.DefaultQuery("sk", "1")
	//page  第几页
	//ctx.Query("p")
	//校验数据
	if aid == "" || sd == "" || ed == "" || sk == "" {
		fmt.Println("传入数据不完整")
		return
	}

	houseService := ctx.Keys["House"].(house.HouseClient)
	var resp = new(house.GetResp)

	var err error
	err = hystrix.Do("house", func() error {
		var err error
		resp, err = houseService.SearchHouse(ctx, &house.SearchReq{
			Aid: aid,
			Sd:  sd,
			Ed:  ed,
			Sk:  sk,
		})
		return err
	}, nil)

	if err != nil {
		fmt.Println("微服务调用错误:", err)
		ResponseError(ctx, utils.RECODE_SERVERERR)
		return
	}
	if resp.Errno == utils.RECODE_DBERR {
		fmt.Println("查询房屋详情错误:", err)
		ResponseError(ctx, utils.RECODE_DBERR)
		return
	}
	fmt.Println("houses index:", resp)
	ResponseOK(ctx, utils.RECODE_OK, resp.Data)
}

// GetUserHouses 获取用户发布的房源信息
// @Summary 获取用户发布的房源信息
// @Description 获取用户发布的房源信息
// @Tags 获取用户发布的房源信息
// @Accept json
// @Produce json
// @Param userName body string true "用户名"
// @Success 200 {string} GetData "信息"
// @Router /api/v1.0/user/houses [GET]
func GetUserHouses(ctx *gin.Context) {
	// 获取当前登录用户
	session := sessions.Default(ctx)
	userName := session.Get("userName")

	// 微服务查询用户名下的房源
	houseService := ctx.Keys["House"].(house.HouseClient)
	var houses = new(house.GetResp)

	var err error
	err = hystrix.Do("house", func() error {
		var err error
		houses, err = houseService.GetUserHouses(ctx, &house.GetReq{
			UserName: userName.(string),
		})
		return err
	}, nil)

	if err != nil {
		fmt.Println("获取房屋信息错误1:", err)
		ResponseError(ctx, utils.RECODE_SERVERERR)
		return
	}
	if houses.Errno == utils.RECODE_DBERR {
		fmt.Println("获取房屋信息错误2:", err)
		ResponseError(ctx, utils.RECODE_DBERR)
		return
	}
	fmt.Println("houses:", houses.Data.Houses)
	// 查询当前用户的所有房屋信息。
	ResponseOK(ctx, utils.RECODE_OK, houses.Data)

}
